﻿

#include "zyToolTips.h"


BlackMoonUI::zyToolTips::zyToolTips()
{
	SetMember(L"this", (LONG_PTR)this);
	m_obj->setWndProc(zyToolTips_WndProc);
	m_obj->setChildWndProc(zyToolTips_ChildWndProc);
	m_obj->setDestroy(zyToolTips_Destroy);
	setType(zyType_ToolTips);
}
BlackMoonUI::zyToolTips::~zyToolTips()
{

}
void BlackMoonUI::zyToolTips::OnNCDestroy()
{

}
void WINAPI BlackMoonUI::zyToolTips::zyToolTips_Destroy(zyObject* obj)
{
	zyWindow::zyWindow_OnNCDestroy(obj);
	zyWindow::zyWindow_Destroy(obj);
}
LRESULT WINAPI BlackMoonUI::zyToolTips::zyToolTips_ChildWndProc(zyObject* obj, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL* bHandle)
{
	if (message == WM_NOTIFY) {
		NMHDR* nm(reinterpret_cast<NMHDR*>(lParam));//reinterpret_cast 转指针 static_cast 转变量
		if (nm->code == TTN_POP) {
			TRegEvent* evtPtr = reinterpret_cast<TRegEvent*>(obj->getRegEvent(L"OnHide"));
			if (evtPtr != nullptr) {
				evtPtr->handler<int>(nm->hwndFrom);
				*bHandle = true;
				return 1;
			}
		}
		else if (nm->code == TTN_SHOW) {
			TRegEvent* evtPtr = reinterpret_cast<TRegEvent*>(obj->getRegEvent(L"OnShow"));
			if (evtPtr != nullptr) {
				evtPtr->handler<int>(nm->hwndFrom);
				*bHandle = true;
				return 1;
			}
		}
	}
	return zyWindow::zyBase_ChildWndProc(obj, hWnd, message, wParam, lParam, bHandle);
}
LRESULT WINAPI BlackMoonUI::zyToolTips::zyToolTips_WndProc(zyObject* obj, HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL* bHandled)
{
	if (uMsg == WM_NCDESTROY) {
		zyToolTips* zyb = (zyToolTips*)obj->getPtrData(L"this");
		zyb->OnNCDestroy();
	}
	return zyWindow::zyWindow_WndProc(obj, hWnd, uMsg, wParam, lParam, bHandled);
}

BOOL BlackMoonUI::zyToolTips::创建(int 参数_窗口风格, int 参数_扩展风格)
{
	if (参数_扩展风格)
		参数_扩展风格 = WS_EX_TOPMOST;
	HWND hWnd = CreateWindowEx(参数_扩展风格, L"tooltips_class32", 0, 参数_窗口风格, 0, 0, 0, 0, 0, 0, zyEnv::getInstance().getHandle(), 0);
	return (zyWindow::_BindWindow(hWnd));
}
bool BlackMoonUI::zyToolTips::添加(HWND 参数_窗口句柄, const std::wstring& 参数_提示文本, bool 参数_显示在正下方, bool 参数_使用绝对位置) {//成功返回真，失败返回假。
	TOOLINFO ti = { 0 };
	ti.cbSize = sizeof(ti);
	ti.lpszText = (LPWSTR)参数_提示文本.c_str();
	ti.uFlags = TTF_SUBCLASS | TTF_IDISHWND | (参数_显示在正下方 ? TTF_CENTERTIP : 0) | (参数_使用绝对位置 ? TTF_TRACK | TTF_ABSOLUTE : 0);
	ti.hwnd = 参数_窗口句柄;
	ti.uId = (UINT_PTR)参数_窗口句柄;
	return SendMessage(取窗口句柄(), TTM_ADDTOOLW, 0, (LPARAM)&ti) != 0;
}
void BlackMoonUI::zyToolTips::删除(HWND 参数_窗口句柄) {//删除 添加 的提示窗口
	TOOLINFO ti = { 0 };
	ti.cbSize = sizeof(ti);
	ti.uFlags = TTF_IDISHWND;
	ti.hwnd = 参数_窗口句柄;
	ti.uId = (UINT_PTR)参数_窗口句柄;
	SendMessage(取窗口句柄(), TTM_DELTOOL, 0, (LPARAM)&ti);
}
void BlackMoonUI::zyToolTips::置提示文本(HWND 参数_窗口句柄, const std::wstring& 参数_提示文本) {
	TOOLINFO ti = { 0 };
	ti.cbSize = sizeof(ti);
	ti.uFlags = TTF_IDISHWND;
	ti.hwnd = 参数_窗口句柄;
	ti.uId = (UINT_PTR)参数_窗口句柄;
	ti.lpszText = (LPWSTR)参数_提示文本.c_str();
	SendMessage(取窗口句柄(), TTM_UPDATETIPTEXTW, 0, (LPARAM)&ti);
}
std::wstring BlackMoonUI::zyToolTips::取提示文本(HWND 参数_窗口句柄) {//取出指定控件当前提示文本。
	TOOLINFO ti = { 0 };
	ti.cbSize = sizeof(ti);
	ti.uFlags = TTF_IDISHWND;
	ti.hwnd = 参数_窗口句柄;
	ti.uId = (UINT_PTR)参数_窗口句柄;
	std::wstring str;
	str.reserve(520);
	ti.lpszText = (LPWSTR)str.c_str();
	if (SendMessage(取窗口句柄(), TTM_GETTOOLINFOW, 0, (LPARAM)&ti) == 0)
		return L"";
	return str;
}
void BlackMoonUI::zyToolTips::置矩形(HWND 参数_窗口句柄, RECT& 参数_新矩形) {//设置指定矩形为工具提示的矩形
	TOOLINFO ti = { 0 };
	ti.cbSize = sizeof(ti);
	ti.hwnd = 参数_窗口句柄;
	ti.uId = (UINT_PTR)参数_窗口句柄;
	ti.rect = 参数_新矩形;
	SendMessage(取窗口句柄(), TTM_NEWTOOLRECTW, 0, (LPARAM)&ti);
}
int BlackMoonUI::zyToolTips::背景色(int 参数_颜色值) {//如果参数颜色值为空表示取背景色，否则参数颜色值为置背景色的颜色值。
	if (参数_颜色值 == 0)
		return (int)sendMsg(TTM_GETTIPBKCOLOR, 0, 0);
	else
		return (int)sendMsg(TTM_SETTIPBKCOLOR, 参数_颜色值, 0);
}
int BlackMoonUI::zyToolTips::文本色(int 参数_颜色值) {//如果参数颜色值为空表示取文本色，否则参数颜色值为置文本色的颜色值。
	if (参数_颜色值 == 0)
		return (int)sendMsg(TTM_GETTIPTEXTCOLOR, 0, 0);
	else
		return (int)sendMsg(TTM_SETTIPTEXTCOLOR, 参数_颜色值, 0);
}
int BlackMoonUI::zyToolTips::取所有窗口(std::vector<HWND>& 参数_窗口句柄数组) {//取出已添加提示的所有窗口。返回数量。
	TOOLINFO ti = { 0 };
	参数_窗口句柄数组.clear();
	int 局部_总数 = (int)sendMsg(TTM_GETTOOLCOUNT, 0, 0);
	for (int i = 0; i < 局部_总数; i++) {
		ti.cbSize = sizeof(ti);
		SendMessage(取窗口句柄(), TTM_ENUMTOOLSW, i, (LPARAM)&ti);
		if (ti.hwnd != 0)
			参数_窗口句柄数组.push_back(ti.hwnd);
	}
	return 局部_总数;
}
int BlackMoonUI::zyToolTips::取坐标窗口(int 参数_x, int 参数_y) {
	POINT point = { 0 };
	point.x = 参数_x;
	point.y = 参数_y;
	return (int)sendMsg(TTM_WINDOWFROMPOINT, 0, (LPARAM)&point);
}
POINT BlackMoonUI::zyToolTips::取气泡尺寸(HWND 参数_窗口句柄) {//获取指定窗口的工具提示尺寸
	POINT point = { 0 };
	TOOLINFO ti = { 0 };
	ti.cbSize = sizeof(ti);
	ti.hwnd = 参数_窗口句柄;
	ti.uId = (UINT_PTR)参数_窗口句柄;
	ti.uFlags = TTF_IDISHWND;
	int size = (int)SendMessage(取窗口句柄(), TTM_GETBUBBLESIZE, 0, (LPARAM)&ti);
	point.x = LOWORD(size);
	point.y = HIWORD(size);
	return point;
}
HWND BlackMoonUI::zyToolTips::取当前窗口() {//获取当前工具提示关联的窗口句柄
	TOOLINFO ti = { 0 };
	ti.cbSize = sizeof(ti);
	sendMsg(TTM_GETCURRENTTOOLW, 0, (LPARAM)&ti);
	return ti.hwnd;
}
RECT BlackMoonUI::zyToolTips::取边距() {
	RECT rc = { 0 };
	sendMsg(TTM_GETMARGIN, 0, (LPARAM)&rc);
	return rc;
}
void BlackMoonUI::zyToolTips::置边距(RECT 参数_边距) {
	sendMsg(TTM_SETMARGIN, 0, (LPARAM)&参数_边距);
}
void BlackMoonUI::zyToolTips::置提示位置(int 参数_屏幕水平位置, int 参数_屏幕垂直位置) {//必须在 添加（） 时 使用绝对位置
	sendMsg(TTM_TRACKPOSITION, 0, MAKELPARAM(参数_屏幕水平位置, 参数_屏幕垂直位置));
}
void BlackMoonUI::zyToolTips::激活跟踪(HWND 参数_窗口句柄, bool 参数_是否激活) {
	TOOLINFO ti = { 0 };
	ti.cbSize = sizeof(ti);
	ti.hwnd = 参数_窗口句柄;
	ti.uId = (UINT_PTR)参数_窗口句柄;
	sendMsg(TTM_TRACKACTIVATE, 参数_是否激活, (LPARAM)&ti);
}